/*
 * @Author: WangGuojian 1085844536@qq.com
 * @Date: 2023-03-28 22:22:08
 * @LastEditTime: 2023-03-28 22:35:10
 * @LastEditors: WangGuojian 1085844536@qq.com
 * @FilePath: \react-admin_clientd:\Developer\WGJ\VSCode_WorkSpace\Web\typescript\code\chapter02\src\05_抽象类.ts
 * @Description:
 */
(function () {
    /**
     * 以 abstract 开头的类是抽象类
     *      抽象类和其他类区别不大，只是不能用来创建对象
     *      抽象类就是专门用来被继承的类
     *
     *      抽象类中可以添加抽象方法
     */
    abstract class Animal {
        name: string;

        constructor(name: string) {
            this.name = name;
        }

        /**
         * 定义一个抽象方法
         * 抽象方法使用 abstract 开头，没有方法体
         * 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
         */
        abstract sayHello(): void;
    }

    class Dog extends Animal {
        sayHello(): void {
            console.log('汪汪汪汪！');
        }
    }

    class Cat extends Animal {
        sayHello(): void {
            console.log('喵喵喵喵！');
        }
    }

    const dog = new Dog('旺财');
    dog.sayHello();
})();
